package cn.smxy.comment.util;

import cn.smxy.client.UserClient;
import cn.smxy.pojo.Comment;
import cn.smxy.pojo.User;
import cn.smxy.vo.CommentVo;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class CommentUtil {

    @Autowired
    private UserClient userClient;

    public List<CommentVo> processComments(List<Comment> list, boolean useTree) {
        // 空间换时间：把commentId和comment放入map，能够快速取到Comment
        Map<Long, CommentVo> map = new HashMap<>();
        // 最终要返回的list
        List<CommentVo> result = new ArrayList<>();
        // 遍历一次，把所有comment加入到map中，方便快速查找映射
        // 如果是父评论，就直接放入result列表
        for (Comment comment : list) {
            CommentVo commentVo = new CommentVo(comment);
            User user = userClient.getUserName(comment.getUserId());
            commentVo.setUserName(user.getUserName());
            commentVo.setUserPhoto(user.getUserPhoto());
            if (comment.getParentId() == null) {
                result.add(commentVo);
            }
            map.put(comment.getCommentId(), commentVo);
        }

        // 再次遍历，子评论放入到父评论的child中
        for (Comment comment : list) {
            // 为子评论设置父评论的userName和userPhoto，以用于前端展示
//            if (comment.getParentId() != null) {
//                Comment parentComment = map.get(comment.getParentId());
//            }
            Long id;
            // 如果是以树形结构构建子评论，需要获取的id就是parent_id
            // 如果是以其它方式（二维数组），需要获取的id就是root_parent_id
            if (useTree) {
                id = comment.getParentId();
            } else {
                id = comment.getRootId();
            }
            // 只要存在父评论/根父评论
            if (id != null) {
                // 直接通过map快速取得评论，并把自己加入到父评论的子集
                CommentVo p = map.get(id);
                if (p.getChild() == null) {
                    p.setChild(new ArrayList<>());
                }
                CommentVo commentVo = map.get(comment.getCommentId());
                p.getChild().add(commentVo);
            }
        }
        return result;
    }

}

